Más Linq en C#
Antes de comenzar con el post vamos a declarar algunos métodos y clases que estaremos usando para los ejemplos que veremos más adelante.
Vamos a necesitar dos métodos utilitarios para imprimir colecciones de datos:
Y una clase Persona
que sobreescriba los métodos Equals
y GetHashCode
:
Listo, más adelante verás por qué sobreescribimos esos dos métodos. Ahora si, comencemos con Linq:
Zip
El método Zip nos ayuda para cuando queremos combinar dos colecciones de datos en el orden en el que estan. Con Zip tu especificas la forma en las que se deben combinar, por ejemplo en la siguiente linea se combinan dos series numéricas, multiplicando cada elemento entre si:
Imprimirá:
También se pueden combinar cadenas, como las de nombres y apellidos para crear un objeto de la clase Persona:
Imprimirá
Equals, GetHashCode & IEqualityComparer
En los siguientes métodos vamos a requerir de una forma de discernir si dos instancias de una misma clase son las mismas o no (y es por eso que sobreescribimos Equals
y GetHashCode
), sin embargo no siempre tendremos acceso a las “entrañas” de una clase para sobrescribir sus métodos o simplemente queremos tener otra forma de comparar dos objetos. Para estos casos podemos usar una implementación de la interfaz IEqualityComparer
, por ejemplo, la siguente clase nos ayudará a distinguir una Persona
de otra únicamente por su nombre:
Union
Con Union
se juntan dos colecciones de datos, es importante que se diferencíe este método de Concat, ya que mientras que uno junta las dos colecciones sin preocuparse del contenido de estas, Union no permite que existan duplicados en la colección resultante:
Imprimirá
Intersect
Es bastante obvio lo que realiza este método, intersecta dos colecciones, dando como resultado otra con solo los elementos que tienen en comun. Nuevamente, usa el método Equals
(o IEqualityComparer
) para decidir qué elementos se parecen y cuales no.
Imprimirá únicamente:
Except
Con Except
podemos filtrar una colección basándonos en otra. En este caso los únicos elementos que forman parte de la nueva colección que existen en coleccion1
que no existen en coleccion2
:
Imprimirá
SequenceEquals
Este método nos ayuda para saber si los elementos que contiene una colección existen en el mismo orden en otra. Si uno tiene menos, si un elemento es distinto o si están en diferente posición, este método devolverá false:
Al igual los demás también este puede funcionar con una implementación de IEqualityComparer
:
Y obtendremos en pantalla:
Distinct
Como tal lo dice el nombre, con Distnict
vamos a poder filtrar los elementos iguales de nuestra colección dejándonos con una que tiene elementos no repetidos entre si:
Este método también acepta una implementación de IEqualityComparer
:
Imprimirá:
All & Any
Estos métodos nos ayudan a responder las preguntas: ¿alguno de los elementos cumple con la condición dada? y ¿todos los elementos cumplen con la condición dada?
Para terminar
En el siguiente post hablaré de cómo podemos crear lenguajes específicos de dominio usando Linq y métodos de extensión.